package cn.lhl.service.cargo;

import cn.lhl.dao.cargo.ContractDao;
import cn.lhl.dao.cargo.ContractProductDao;
import cn.lhl.domain.cargo.Contract;
import cn.lhl.domain.cargo.ContractProduct;
import cn.lhl.domain.cargo.ContractProductExample;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

@Service
public class ContractProductServiceImpl implements ContractProductService {
    @Autowired
    private ContractProductDao contractProductDao;

    @Autowired
    private ContractDao contractDao;

    public PageInfo findAll(ContractProductExample example, int page, int size) {
        //查询所有货物并分页
        PageHelper.startPage(page, size);
        List<ContractProduct> contractProducts = contractProductDao.selectByExample(example);
        return new PageInfo(contractProducts);
    }

    public ContractProduct findById(String id) {
        ContractProduct contractProduct = contractProductDao.selectByPrimaryKey(id);
        return contractProduct;
    }

    //新增合同上的货物
    public void save(ContractProduct contractProduct) {
        //若货物数量及货物价格都不为空则计算货物的价值且赋值
        double cpAmount = 0.0d;
        if (contractProduct.getCnumber() != null && contractProduct.getPrice() != null) {
            cpAmount = contractProduct.getPrice() * contractProduct.getCnumber();
        }
        contractProduct.setAmount(cpAmount);
        //获得合同实体类
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        //判断是否有该合同,有才进行下一步
        if (contract != null) {
            //更新合同上的金额
            if (contract.getTotalAmount() != null) {
                //合同上原先有货物
                contract.setTotalAmount(contract.getTotalAmount() + cpAmount);
            } else {
                //第一次添加货物
                contract.setTotalAmount(cpAmount);
            }
            //更新合同上的货物数量
            if (contract.getProNum() != null) {
                contract.setProNum(contract.getProNum() + contractProduct.getCnumber());
            } else {
                contract.setProNum(contractProduct.getCnumber());
            }
            //数据库中添加货物
            contractProductDao.insertSelective(contractProduct);
            //更新合同信息
            contractDao.updateByPrimaryKeySelective(contract);
        }
    }

    //修改合同及货物
    public void update(ContractProduct contractProduct) {
        //给传入的货物实体类的总金额赋值
        double cpAmount = 0.0d;
        if (contractProduct.getCnumber() != null && contractProduct.getPrice() != null) {
            cpAmount = cpAmount + contractProduct.getPrice() * contractProduct.getCnumber();
        }
        contractProduct.setAmount(cpAmount);
        //修改货物信息
        //得到之前的货物信息
        ContractProduct oldContractProduct = contractProductDao.selectByPrimaryKey(contractProduct.getId());
        //实体类中更新信息
        contractProduct.setCnumber(contractProduct.getCnumber());
        contractProduct.setPrice(contractProduct.getPrice());
        //数据库更新
        contractProductDao.updateByPrimaryKeySelective(contractProduct);
        //更新合同信息
        //根据货物找到对应合同实体类
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        if (contract != null) {
            //思路无非就是减去原先的加上要修改的的
            contract.setProNum(contract.getProNum() - oldContractProduct.getCnumber() + contractProduct.getCnumber());
            contract.setTotalAmount(contract.getTotalAmount() - oldContractProduct.getAmount() + contractProduct.getAmount());
            //更新数据库中合同信息
            contractDao.updateByPrimaryKeySelective(contract);
        }
    }

    public void delete(String id) {
        //删除货物需要将合同中的信息更新
        //获得该id的合同实体
        //先获得货物实体类从而获得合同实体类
        ContractProduct contractProduct = contractProductDao.selectByPrimaryKey(id);
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        //更新合同上的货物数量
        contract.setProNum(contract.getProNum() - contractProduct.getCnumber());
        //更新合同中的总价格
        contract.setTotalAmount(contract.getTotalAmount() - contractProduct.getAmount());
        //更新合同
        contractDao.updateByPrimaryKeySelective(contract);
        //删除货物信息
        contractProductDao.deleteByPrimaryKey(id);
    }
}
